package xin.marcher.module.diplomacy.manager.common.db;

import xin.marcher.module.diplomacy.manager.common.cache.RedisStringCache;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
 * string类型数据源
 */
public interface RedisStringDatabase<T> {

    /**
     * 数据源单表
     *
     * @return java.lang.String
     */
    String getTableName();

    /**
     * 布隆过滤器对应的字段
     *
     * @return java.lang.String
     */
    String getBloomField();

    /**
     * 数据源全量表
     *
     * @return java.util.Set<java.lang.String>
     */
    Set<String> getTableNameSet();

    /**
     * 获取表变更主键ID集合
     *
     * @return java.util.Optional<java.util.Set < java.lang.Integer>>
     */
    Optional<Set<Long>> getTableUpdateIdSet();

    /**
     * 获取表单个字段集合
     *
     * @param field
     * @return
     */
    Optional<List<String>> getTableSingleFiled(String field);

    /**
     * 获取单表所有主键ID集合
     *
     * @return java.util.Optional<java.util.List < java.lang.Integer>>
     */
    Optional<List<Integer>> getTableAllIdList();

    /**
     * 获取主表ID集合（关联表变更需要查询主表）
     *
     * @param relationTableName  关联表名
     * @param relationTableIdSet 关联表主键集合
     * @return java.util.Optional<java.util.Set < java.lang.Integer>>
     */
    Optional<Set<Long>> getTableIdSetByRelationTableIdSet(String relationTableName, Set<Long> relationTableIdSet);

    /**
     * 获取表数据
     *
     * @param tableFieldsMap key 数据库字段，value 字段值
     * @param queryType      查询类型，多数据查询时区分
     * @return java.util.Optional<T>
     */
    Optional<T> getTableData(Map<String, Object> tableFieldsMap, String queryType);

    /**
     * 获取表集合数据
     *
     * @param tableFieldsMap
     * @param queryType
     * @return java.util.Optional<java.util.List < T>>
     */
    Optional<List<T>> listTableData(Map<String, Object> tableFieldsMap, String queryType);

    /**
     * 根据ID批量获取数据
     *
     * @param idSet     表主键ID集合
     * @param queryType 查询类型，多数据查询时区分
     * @return java.util.Optional<xin.marcher.module.diplomacy.manager.common.source.RedisStringSource < T>>
     */
    Optional<RedisStringCache<T>> listTableDataByIdSet(Set<Long> idSet, String queryType);

    /**
     * 根据其他关键字段批量获取数据
     *
     * @param idSet     表关键字段集合
     * @param queryType 查询类型，多数据查询时区分
     * @return java.util.Optional<xin.marcher.module.diplomacy.manager.common.source.RedisStringSource < T>>
     */
    Optional<RedisStringCache<T>> listTableDataByIdSet(List<Long> idSet, String queryType);


}

